package com.cloud.bssp.chinesenewyear.grabredenvelope;

import com.cloud.bssp.chinesenewyear.grabredenvelope.entity.GrabEnvelopeLogDO;
import com.cloud.bssp.chinesenewyear.grabredenvelope.entity.PeopleDO;
import com.cloud.bssp.chinesenewyear.grabredenvelope.entity.RedEnvelopeDO;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @description： 全局数据存储（为了方便学习，我没有使用任何的数据库等，直接通过内存当时存储）
 * @author：weirx
 * @date：2022/1/6 10:01
 * @version：3.0
 */
@Data
public class GlobalDataCache {

    /**
     * AtomicInteger是原子性的，能够保证在并发环境下的数据原子性
     * 通过CAS（compare and swap，比较并替换）实现的原子性
     *
     * 我使用这个变量作为后面对象的自增id
     */
    private final AtomicInteger atomicInteger = new AtomicInteger(0);

    /**
     * 存储全部用户数据
     */
    private Map<Integer, PeopleDO> peopleCache = new HashMap<>();

    /**
     * 存储全部红包数据
     */
    private Map<Integer, RedEnvelopeDO> redEnvelopeCache = new HashMap<>();

    /**
     * 红包历史数据 Map<红包id, Map<用户id,GrabEnvelopeLogDO>>
     */
    private Map<Integer, Map<Integer, GrabEnvelopeLogDO>> envelopeLogCache = new HashMap<>();

    /**
     * 获取全局唯一id
     *
     * incrementAndGet方法使用CAS自加1，保证原子性
     *
     * @return
     */
    public Integer getId() {
        return atomicInteger.incrementAndGet();
    }
}
